package com.windhot.manager
{
	import flash.events.Event;
	import flash.filesystem.File;
	import flash.filesystem.FileMode;
	import flash.filesystem.FileStream;
	import flash.net.FileFilter;
	import flash.net.ObjectEncoding;
	import flash.utils.ByteArray;

	/**
	 * FileManager 
	 * @author naiking
	 */	
	public class FileManager
	{
		public function FileManager()
		{
			throw new Event("can nnt new!");
		}
		/**
		 * @selectedHandler 选中回调 返回全路径
		 * @param description 打开浏览时，文件类型显示的文本如：*.text 
		 * @param filter 可显示的扩展名“*.as;*.png;*.xml”
		 * 
		 */		
		public static function openFile(selectedHandler:Function,description:String="*",filterStr:String=null):void
		{
			var fileToOpen:File = File.documentsDirectory;    
			selectTextFile(fileToOpen);    
			function selectTextFile(root:File):void    
			{    
				var txtFilter:FileFilter = new FileFilter(description,filterStr);    
				root.browseForOpen("Open", [txtFilter]);    
				root.addEventListener(Event.SELECT, fileSelected);    
			}    
			function fileSelected(event:Event):void    
			{    
				selectedHandler(fileToOpen.nativePath);    
			}   
		}
		/**
		 * 读取xml
		 * @param xmlPath xml路径
		 * @return 
		 * 
		 */
		public static function readXml(xmlPath:String):XML
		{
			var file:File=new File(xmlPath);
			if(file.exists == false) return null
			var fs:FileStream=new FileStream();
			fs.open(file,FileMode.READ);
			var tempStr:String;
			tempStr=fs.readUTFBytes(fs.bytesAvailable);
			fs.close();
			var tempXml:XML=new XML(tempStr);
			
			return tempXml;
		}
		
		/**
		 * 写入xml
		 * @param xml xml数据
		 * @param path 写入文件路径
		 * @param endFun 回调函数
		 * 
		 */		
		public static function writeXml(xml:XML,path:String):void
		{
			var file:File=new File(path);
			var fileStream:FileStream=new FileStream();
			fileStream.open(file,FileMode.WRITE);
			fileStream.writeUTFBytes(xml.toXMLString());
			fileStream.close();
		}		
		/**
		 * 保存文件(从二进制)
		 * 
		 */	
		public static function saveFile($ba:ByteArray,$path:String):void
		{
			var file:File = File.desktopDirectory.resolvePath($path);
			var fs:FileStream = new FileStream();
			fs.open(file,FileMode.WRITE);
			$ba.position = 0;
			fs.writeBytes($ba,0,$ba.bytesAvailable);
			fs.close();
			return;
		}
		
		/**
		 * 保存文件(从字符串)....
		 * 
		 */	
		public static function saveFile3($str:String,$path:String):void
		{
			var file:File = File.desktopDirectory.resolvePath($path);
			var fs:FileStream = new FileStream();
			fs.open(file,FileMode.WRITE);
			fs.position=0;
			fs.writeUTFBytes($str);
			fs.close();
			return;
		}		
		/**
		 * 读取文件（读取为二进制）
		 * 
		 */	
		public static function readFile($path:String):ByteArray
		{
			var ba:ByteArray = new ByteArray();
			
			var file:File = File.desktopDirectory.resolvePath($path);
			if(file.exists)
			{
				var fs:FileStream = new FileStream();          
				fs.open(file,FileMode.READ);
				fs.position = 0;
				fs.readBytes(ba,0,fs.bytesAvailable)
				fs.close();
			}
			return ba;
		}
		
		/**
		 * 读取文件(读取为文本)
		 * 
		 */	
		public static function readFile2($path:String):String
		{
			var str:String = "";
			
			var file:File = File.desktopDirectory.resolvePath($path);
			if(file.exists)
			{
				var fs:FileStream = new FileStream();          
				fs.open(file,FileMode.READ);
				fs.position = 0;
				str = fs.readUTFBytes(fs.bytesAvailable);
				fs.close();
			}
			return str;
		}	
		/**
		 * 获取所有指定扩展名的文件（包括子目录内的,不包括隐藏目录内的文件,不包括隐藏文件）的一个数组
		 * @param $eNames 举例：["xml","swf"]，为保证效率，程序里不做大小写转换，所以参数应保证输入扩展名为小写
		 * return 格式：[[eName:String, file:File]...]
		 */	
		public static function getAllFilesByExt($directory:File,$extension:Array):Array
		{
			//if($eName.charAt(0)!=".")$eName += ".";
			var files:Array = new Array();
			if(!$directory.isHidden)
			{
				if(!$directory.isDirectory)
				{
					var eName:String = $directory.extension;
					if($extension.indexOf(eName)!=-1)
					{
						files.push([eName,$directory]);
					}
				}
				else
				{
					var childFiles:Array = $directory.getDirectoryListing();
					for(var i:uint = 0; i < childFiles.length; i++)
					{
						files = files.concat(getAllFilesByExt(childFiles[i],$extension));
					}
				}
			}
			return files;
		}
		
		/**
		 * 获取所有指定扩展名的文件（包括子目录内的,不包括隐藏目录内的文件,不包括隐藏文件）的一个数组
		 * @param $eNames 举例：["xml","swf"]，为保证效率，程序里不做大小写转换，所以参数应保证输入扩展名为小写
		 * 
		 */	
		public static function getFileListByExt($directory:File,$extension:Array):Array
		{
			var files:Array = new Array();
			if(!$directory.isHidden)
			{
				if(!$directory.isDirectory)
				{
					var eName:String = $directory.extension;
					if($extension.indexOf(eName)!=-1)
					{
						files.push($directory);
					}
				}
				else
				{
					var childFiles:Array = $directory.getDirectoryListing();
					for(var i:uint = 0; i < childFiles.length; i++)
					{
						files = files.concat(getFileListByExt(childFiles[i],$extension));
					}
				}
			}
			return files;
		}
		/**
		 * 保存文本文件
		 * 
		 */	
		public static function saveText($str:String,$path:String):void
		{
			var file:File = File.desktopDirectory.resolvePath($path);
			var fs:FileStream = new FileStream();
			fs.open(file,FileMode.WRITE);
			fs.writeUTFBytes($str)
			fs.close();
			return;
		}
		/**
		 *创建目录 
		 * @param name 文件夹名
		 * @param $path所在路径
		 * 
		 */		
		public static function createDirectory(name:String,$path:String):void
		{
			var file1:File=new File($path+"\\"+name);
			file1.createDirectory(); 
		}
		/**
		 *保存XML数据 
		 * @param $xml
		 * @param $path 全路径名：d;//windows/ abc.xml
		 * 
		 */		
		public static function saveXML($xml:XML,$path:String):void
		{
			var file:File = File.desktopDirectory.resolvePath($path);
			var fs:FileStream = new FileStream();
			fs.open(file,FileMode.WRITE);
			fs.writeUTFBytes($xml.toXMLString())
			fs.close();
			return;
		}
		/**
		 * 读取XML文件
		 * 
		 */	
		public static function readXML($path:String):XML
		{
			var xml:XML;
			
			var file:File = File.desktopDirectory.resolvePath($path);
			if(file.exists)
			{
				var fs:FileStream = new FileStream();          
				fs.open(file,FileMode.READ);
				xml = XML(fs.readUTFBytes(fs.bytesAvailable));
				fs.close();
			}
			return xml;
		}	
		/**
		 * 获取所有指定扩展名的文件（不包括隐藏目录内的文件,不包括隐藏文件）的一个数组
		 * @param $eNames 举例：[".xml",".swf"]，为保证效率，程序里不做大小写转换，所以参数应保证输入扩展名为小写, 不限制则请传null
		 * return 格式：[file:File...]
		 */	
		public static function getFiles($directory:File,$eNames:Array=null):Array
		{
			var files:Array = [];
			if(!$directory.isHidden && $directory.name!=".svn")
			{
				var childFiles:Array = $directory.getDirectoryListing();
				for each(var file:File in childFiles)
				{
					var eName:String = file.url.replace(/^.+(\.[A-Za-z\d_]+)$/,"$1").toLowerCase();
					if((!file.isDirectory) && (!file.isHidden) && ($eNames==null || $eNames.indexOf(eName)!=-1))
					{
						files.push(file);
					}
				}
			}
			return files;
		}
		/**
		 * 获取指定目录下的所有文件夹（不包括隐藏目录内的文件,不包括隐藏文件）的一个数组
		 * @param $ignoreFolders 忽略的文件夹数组，如果传null则不忽略任何文件夹
		 * return 格式：[file:File...]
		 */	
		public static function getDirs($directory:File, $ignoreFolders:Array=null):Array
		{
			var files:Array = [];
			if(!$directory.isHidden && $directory.name!=".svn")
			{
				var childFiles:Array = $directory.getDirectoryListing();
				for each(var file:File in childFiles)
				{
					if(
						file.isDirectory
						&& 
						(!file.isHidden) 
						&&
						file.name!=".svn"
						&& 
						($ignoreFolders==null || $ignoreFolders.indexOf(file.name)==-1)
					)
					{
						files.push(file);
					}
				}
			}
			return files;
		}
		/**
		 * (递归)获取所有指定扩展名的文件（包括子目录内的,不包括隐藏目录内的文件,不包括隐藏文件）的一个数组
		 * @param $eNames 举例：[".xml",".swf"]，为保证效率，程序里不做大小写转换，所以参数应保证输入扩展名为小写
		 * return 格式：[file:File...]
		 */	
		public static function getAllFiles($directory:File,$eNames:Array):Array
		{
			//if($eName.charAt(0)!=".")$eName += ".";
			var files:Array = new Array();
			if(!$directory.isHidden && $directory.name!=".svn")
			{
				if(!$directory.isDirectory)
				{
					var eName:String = $directory.url.replace(/^.+(\.[A-Za-z\d_]+)$/,"$1").toLowerCase();
					if($eNames.indexOf(eName)!=-1)
					{
						files.push($directory);
					}
				}
				else
				{
					var childFiles:Array = $directory.getDirectoryListing();
					for(var i:uint = 0; i < childFiles.length; i++)
					{
						files = files.concat(getAllFiles(childFiles[i],$eNames));
					}
				}
			}
			return files;
		}
		/**
		 * 读取文本文件
		 * 
		 */
		public static function readText($path:String):String
		{
			var str:String;
			
			var file:File = File.desktopDirectory.resolvePath($path);
			if(file.exists)
			{
				var fs:FileStream = new FileStream();          
				fs.open(file,FileMode.READ);
				str = fs.readUTFBytes(fs.bytesAvailable);
				fs.close();
			}
			return str;
		}
		/**
		 *  获取所有指定文件名的文件（包括子目录内的,不包括隐藏目录内的文件,不包括隐藏文件）的一个数组
		 * @param $directory
		 * @param $name
		 * @return 
		 * 
		 */
		public static function getAllFilesByName($directory:File,$name:Array):Array
		{
			//if($eName.charAt(0)!=".")$eName += ".";
			var files:Array = new Array();
			if(!$directory.isHidden)
			{
				if(!$directory.isDirectory)
				{
					var eName:String = $directory.name;
					trace(eName);
					if($name.indexOf(eName)!=-1)
					{
						files.push([eName,$directory]);
					}
				}
				else
				{
					var childFiles:Array = $directory.getDirectoryListing();
					for(var i:uint = 0; i < childFiles.length; i++)
					{
						files = files.concat(getAllFilesByExt(childFiles[i],$name));
					}
				}
			}
			return files;
		}
		/**
		 *  获取所有指定文件名的文件夾（包括子目录内的,不包括隐藏目录内的文件,不包括隐藏文件）的一个数组
		 * @param $directory
		 * @param $name
		 * @return 
		 * 
		 */		
		public static function getAllFoldsByName($directory:File,$fname:Array):Array
		{
			//if($eName.charAt(0)!=".")$eName += ".";
			var files:Array = new Array();
			if(!$directory.isHidden)
			{
				if(!$directory.isDirectory)
				{
					
				}
				else
				{
					var foldName:String = $directory.name;
					if($fname.indexOf(foldName) != -1) {
						files.push([foldName,$directory]);
						
					} else {
					
						var childFiles:Array = $directory.getDirectoryListing();
						for(var i:uint = 0; i < childFiles.length; i++)
						{
							files = files.concat(getAllFoldsByName(childFiles[i],$fname));
						}
					}
				}
			}
			return files;
		}		
		/**(递归)
		 * 获取指定目录下的所有文件夹（不包括隐藏目录内的文件,不包括隐藏文件）的一个数组
		 * @param $ignoreFolders 忽略的文件夹数组，如果传null则不忽略任何文件夹
		 * return 格式：[file:File...]
		 */	
		public static function getAllDirs($directory:File, $ignoreFolders:Array=null):Array
		{
			var files:Array = [];
			if(!$directory.isHidden)
			{
				var childFiles:Array = $directory.getDirectoryListing();
				for each(var file:File in childFiles)
				{
					if(
						file.isDirectory 
						&& 
						(!file.isHidden) 
						&& 
						file.name!=".svn"
						&& 
						($ignoreFolders==null || $ignoreFolders.indexOf(file.name)==-1)
					)
					{
						files.push(file);
						files = files.concat(getAllDirs(file, $ignoreFolders));
					}
				}
			}
			return files;
		}
		/**递归的获取目录树结构*/
		public static function getFileDirectoryTree(file:File):XML
		{
			var xml:XML=<files/>;
			return loopFile(file,xml);
		}
		private static function loopFile(file:File,xml:XML):XML
		{
			var ary:Array=file.getDirectoryListing();
			for(var i:int=0;i<ary.length;i++)
			{
				var node:XML=<file name={ary[i].name} path={ary[i].nativePath} extendName={ary[i].extension} icon=""/>;
				xml.appendChild(node);
				if(ary[i].isDirectory)
				{
					loopFile(ary[i],node);
				}
			}
			return xml;
		}
	}//end of class
}//end of package